package priv.tuyou.dao;

import java.util.List;
import java.util.Map;

import priv.tuyou.bo.Page;
import priv.tuyou.bo.SqlParamGroup;

/**
 * dao层的公共接口
 * @author：涂有
 * @date 2016年12月26日 下午6:11:03
 */
public interface IDao {
	
	/**
	 * 获取实体（没有标记为删除的）
	 * @author：涂有
	 * @date 2016年12月26日 下午10:47:59
	 * @param id 主键
	 * @return 返回泛型实体
	 */
	<T, PK> T get(Class<T> c, PK id);
	
	/**
	 * 获取实体忽略其是否已被标记删除
	 * @author：涂有
	 * @date 2016年12月31日 下午5:47:30
	 * @param c
	 * @param id
	 * @return
	 */
	<T, PK> T getIgnoreDeleted(Class<T> c, PK id);
	
	/**
	 * 获取指定的字段
	 * @author：涂有
	 * @date 2016年12月26日 下午11:00:32
	 * @return
	 */
	<T, PK> Object getField(Class<T> c, PK id, String...fieldNames);
	
	/**
	 * 获取指定的字段
	 * @author：涂有
	 * @date 2016年12月26日 下午11:00:32
	 * @return
	 */
	<T, PK> Object getFieldIgnoreDeleted(Class<T> c, PK id, String...fieldNames);
	
	/**
	 * 逻辑删除
	 * @author：涂有
	 * @date 2016年12月26日 下午10:48:33
	 * @param id 主键
	 * @return 删除条数
	 */
	<T, PK> int delete(Class<T> c, PK id);
	
	/**
	 * 物理删除
	 * @author：涂有
	 * @date 2016年12月26日 下午10:49:11
	 * @param id 主键
	 * @return 删除条数
	 */
	<T, PK> int realDelete(Class<T> c, PK id);
	
	/**
	 * 保存实体
	 * @author：涂有
	 * @date 2016年12月26日 下午10:55:20
	 * @param t 实体
	 * @return 保存条数
	 */
	<T> int save(T t);
	
	/**
	 * 修改实体
	 * @author：涂有
	 * @date 2016年12月26日 下午10:55:54
	 * @param t 实体
	 * @return 修改条数
	 */
	<T> int update(T t);
	
	/**
	 * 修改实体，忽略其是否已被标记为删除
	 * @author：涂有
	 * @date 2016年12月31日 下午5:55:12
	 * @param t
	 * @return
	 */
	<T> int updateIgnoreDeleted(T t);
	
	/**
	 * 修改部分字段
	 * @author：涂有
	 * @date 2016年12月27日 上午12:10:42
	 * @param t 实体泛型
	 * @param id 实体主键
	 * @param map 修改的字段
	 * @return 修改条数
	 */
	<T, PK> int update(Class<T> c, PK id, Map<String, Object> map);
	
	/**
	 * 修改部分字段，忽略其是否已被标记为删除
	 * @author：涂有
	 * @date 2016年12月31日 下午5:55:59
	 * @param c
	 * @param id
	 * @param map
	 * @return
	 */
	<T, PK> int updateIgnoreDeleted(Class<T> c, PK id, Map<String, Object> map);

	/**
	 * 获取所有实体
	 * @author：涂有
	 * @date 2016年12月31日 下午6:24:19
	 * @return
	 */
	<T> List<T> queryAll(Class<T> c);

	/**
	 * 获取所有实体，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2016年12月31日 下午6:33:42
	 * @return
	 */
	<T> List<T> queryAllIgnoreDeleted(Class<T> c);

	/**
	 * 根据条件查询实体
	 * @author：涂有
	 * @date 2016年12月31日 下午6:24:19
	 * @return
	 */
	<T> List<T> query(Class<T> c, SqlParamGroup params);

	/**
	 * 根据条件查询实体，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2016年12月31日 下午6:34:53
	 * @param params
	 * @return
	 */
	<T> List<T> queryIgnoreDeleted(Class<T> c, SqlParamGroup params);

	/**
	 * 根据条件查询指定的字段
	 * @author：涂有
	 * @date 2016年12月31日 下午6:30:32
	 * @param params
	 * @param fieldNames
	 * @return
	 */
	<T> Object query(Class<T> c, SqlParamGroup params, String...fieldNames);

	/**
	 * 根据条件查询指定的字段，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2016年12月31日 下午6:35:50
	 * @param c
	 * @param params
	 * @param fieldNames
	 * @return
	 */
	<T> Object queryIgnoreDeleted(Class<T> c, SqlParamGroup params, String...fieldNames);

	/**
	 * 统计指定实体的数量
	 * @author：涂有
	 * @date 2016年12月31日 下午6:27:30
	 * @param c
	 * @return
	 */
	<T> long count(Class<T> c);
	
	/**
	 * 统计指定实体的数量，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2017年1月2日 上午1:21:31
	 * @param c
	 * @return
	 */
	<T> long countIgnoreDeleted(Class<T> c);

	/**
	 * 根据条件统计数量
	 * @author：涂有
	 * @date 2016年12月31日 下午6:28:36
	 * @param c
	 * @param params
	 * @return
	 */
	<T> long count(Class<T> c, SqlParamGroup params);
	
	/**
	 * 根据条件统计数量，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2017年1月2日 上午1:21:56
	 * @param c
	 * @param params
	 * @return
	 */
	<T> long countIgnoreDeleted(Class<T> c, SqlParamGroup params);
	
	/**
	 * 分页查询
	 * @author：涂有
	 * @date 2017年1月2日 上午1:19:49
	 * @param c
	 * @param page
	 */
	<T> void pageQuery(Class<T> c, Page<T> page);
	
	/**
	 * 分页查询，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2017年1月2日 上午1:22:24
	 * @param c
	 * @param page
	 */
	<T> void pageQueryIgnoreDeleted(Class<T> c, Page<T> page);
	
	/**
	 * 带查询条件的分页查询
	 * @author：涂有
	 * @date 2017年1月2日 上午1:20:02
	 * @param c
	 * @param page
	 * @param params
	 */
	<T> void pageQuery(Class<T> c, Page<T> page, SqlParamGroup params);
	
	/**
	 * 带查询条件的分页查询，忽略是否已被标记为删除
	 * @author：涂有
	 * @date 2017年1月2日 上午1:22:48
	 * @param c
	 * @param page
	 * @param params
	 */
	<T> void pageQueryIgnoreDeleted(Class<T> c, Page<T> page, SqlParamGroup params);
}
